const { createConsola } = require("consola");
const { execSync } = require("child_process");
const { repository } = require("../package.json");
const { gray } = require("kolorist");
const { simpleGit } = require("simple-git");
const logger = createConsola().withTag("release");

/**
 * 自动发版
 * @param {import('plop').NodePlopAPI} plop
 */
async function release(plop) {
  const git = simpleGit();

  const remotes = await git.getRemotes(true);

  const urls = remotes.map((r) => {
    return r.refs.push
      .replace("git@github.com:", "https://github.com/")
      .replace(".git", "");
  });
  let allowRelease = false;
  if (!urls.includes(repository.url)) {
    allowRelease = await logger.prompt(`是否发布到 ${gray(repository.url)}`, {
      type: "confirm",
    });
  } else {
    allowRelease = true;
  }

  if (allowRelease) {
    plop.setGenerator("controller", {
      description: "自动发版",
      prompts: [
        {
          name: "type",
          type: "list",
          default: "patch",
          message: "你希望发布一个什么版本?",
          choices: [
            "patch",
            "minor",
            "major",
            "prepatch",
            "premajor",
            "preminor",
            "prerelease",
          ],
        },
      ],
      actions(answer) {
        const { type } = answer;
        execSync(
          `npx changelogen --${type} --release && git push --follow-tags`,
          {
            stdio: "inherit",
          },
        );
        return [];
      },
    });
  }
}

module.exports = release;
